iT邦幫忙

2023 iThome 鐵人賽

DAY 2
0
AI & Data

從Keras框架與數學概念了解機器學習系列 第 2

[從Keras框架與數學概念了解機器學習] - 2. Dense Layer

  • 分享至 

  • xImage
  •  

https://ithelp.ithome.com.tw/upload/images/20230902/20144614BpNtUccDxV.jpg

keras有提供數種Layer類別使用,但這邊先看最常用的類別怎麼初始運作,在舉一反三去看其它的應用。

先看一下範例:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential()

model.add(Dense(units=64, activation='relu'))
model.add(Dense(units=10, activation='softmax'))

model.compile(loss='categorical_crossentropy',
              optimizer='sgd',
              metrics=['accuracy'])
              
model.build(input_shape=(None, 3))

如此可以初步建構一個類神經網路。

本節要先認識一下層,剛開始做了什麼。

類別 "keras.engine.base_layer " 扮演建構模型中重要的角色,也就是說,模型是由這些類別組合出來的。
一開始新增物件實體,重點在設定部分,包含父類別的建構子也是在做設定相關屬性的動作。這邊認識有如先見見客人客戶一般,之後再深入聊聊的概念。

這些設定會影響隨後訓練會怎麼運作。所以初始建構類別實體運作著重在參數設定。在順序上先知道運作就好,一開始直接去看每個參數是做什麼,實際上無法融會貫通,剛開始有看等於沒看,所以先了解運作與目的即可,待之後的步驟就會反覆回頭發現這些設定的內容要做什麼,這樣的順序是比較有效率的。

這邊點到的運作重點為:

keras.layers.core.dense 繼承 keras.engine.base_layer.Layer,針對 Dense Layer 大概檢視一下其類別內容長什麼樣子:
https://ithelp.ithome.com.tw/upload/images/20230902/20144614y2W6YnyiLf.jpg

而首先到 keras.layers.core.dense 的父類別 "keras.engine.base_layer.Layer" 的建構子方法__new__中。
建構子主要會把 keras.layers.core.dense的 init 方法的參數名稱取出:
 ['self', 'units', 'activation', 'use_bias', 'kernel_initializer', 'bias_initializer', 'kernel_regularizer', 'bias_regularizer', 'activity_regularizer', 'kernel_constraint', 'bias_constraint']

將這些參數對應實際所傳的值組成dictionary,更新到kwargs中,供後續初始化時使用。 
如此案例,layers.Dense(units=64, activation='relu'), 參數值64就會對應到 'units', 會將 {'units': 64} 更新到 **kwargs中成為 kwargs = {'activation': 'relu', 'units': 64} 。

接下來 執行 keras.layers.core.dense 的 init 方法。此方法被@utils.allow_initializer_layout裝飾,稍後回來敘述。於此方法中,將會初始化以下欄位:

(1) keras.layers.core.dense.Dense.units = int(units):
  為輸出張量的維度值。於範例程式參數值為 64。

(2) keras.layers.core.dense.Dense.activation = activations.get({activation_name}):
設定激活函數。
{activation_name}為參數所指定activation="relu",會透過位於keras.activations
中activations.get 方法取得函式主體,取得方式為從 keras.layers.activation 此模組中定義的
callable物件取得。由此例activation="relu",會於keras.activations 中被搜尋到。最後透
過keras.saving.serialization_lib.deserialize_keras_object函式將對應到 types.FunctionType
的relu函式主體回傳。

(3) keras.layers.core.dense.Dense.use_bias = True:
是否使用bias向量,預設True。

(4) keras.layers.core.dense.Dense.kernel_initializer = initializers.get({kernel_initializer}):
keras文件說明此參數為:Initializer for the kernel weights matrix。
透過 keras.initializers.get 來取得instance。keras.initializers.get經由傳入預設
{kernel_initializer}='glorot_uniform'字串,進而取得由
keras.saving.legacy.serialization.deserialize_keras_object 所產生的 instance object。這邊會回
傳keras.initializers.initializers.GlorotUniform。
(如果非 legacy之 module,則會由keras.saving.serialization_lib.deserialize_keras_object函式來
回傳 instance object,類似activations.get函式所實行之方式。)

(5) keras.layers.core.dense.Dense.bias_initializer = initializers.get({bias_initializer}):
keras文件說明此參數為:Initializer for the bias vector。
透過 keras.initializers.get 來取得instance。因預設{bias_initializer} = None,所以沒有指定參數
的話也是回傳None。

(6) keras.layers.core.dense.Dense.kernel_regularizer = regularizers.get({kernel_regularizer}):
keras文件說明此參數為:Regularizer function applied to the kernel weights matrix.
透過 keras.initializers.get 來取得instance。因預設{kernel_regularizer} = None,所以沒有指定參數
的話也是回傳None。

(7) keras.layers.core.dense.Dense.bias_regularizer = regularizers.get({bias_regularizer}):
keras文件說明此參數為:Regularizer function applied to the bias vector。
透過 keras.initializers.get 來取得instance。因預設{bias_regularizer} = None,所以沒有指定參數的
話也是回傳None。

(8) keras.layers.core.dense.Dense.kernel_constraint = constraints.get({kernel_constraint}):
keras文件說明此參數為:Constraint function applied to the kernel weights matrix。
透過 keras.initializers.get 來取得instance。因預設{kernel_constraint} = None,所以沒有指定參數
的話也是回傳None。

(9) keras.layers.core.dense.Dense.bias_constraint = constraints.get({bias_constraint}):
keras文件說明此參數為:Constraint function applied to the bias vector。
透過 keras.initializers.get 來取得instance。因預設{bias_constraint} = None,所以沒有指定參數的話
也是回傳None。

(10)keras.layers.core.dense.Dense.input_spec = InputSpec(min_ndim=2):
透過keras.engine.input_spec 類別指定每個輸入張量的rank、dtype 和 shape。

(11)keras.layers.core.dense.Dense.supports_masking = True:
設定當序列數據丟失,將其忽略的機制。

keras.layers.core.dense 的 init 方法執行完後,因為@utils.allow_initializer_layout修飾子裝飾了此__init__方法,所以會執行utils.allow_initializer_layout的內容:
檢查是否keras.layers.core.dense的參數是否有符合
[
"alpha_initializer","beta_initializer","bias_initializer","depthwise_initializer","embeddings_initializer","gamma_initializer","kernel_initializer","moving_mean_initializer","moving_variance_initializer","pointwise_initializer","recurrent_initializer",
]
其中參數名稱,若有符合且存在實例物件,則直接設定對應名稱屬性(若無則新增屬性)到keras.layers.core.dense 實例內。

而每個 keras.layers.core.dense 要透過 build 函式建構後,模型會再逐一呼叫 call 函式來進行相關的運算。
以上是建構模型時使用keras.layers.core.dense類別初始化過程,未來用來組合模型的內容的紀錄。


上一篇
[從Keras框架與數學概念了解機器學習] - 1.從基本開始
下一篇
[從Keras框架與數學概念了解機器學習] - 3. Sequence Model
系列文
從Keras框架與數學概念了解機器學習30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言